#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

void print(const list<int> lt)
{
	list<int>::const_iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

void test1()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	// 迭代器
	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	// 反向迭代器
	list<int>::reverse_iterator rit = lt.rbegin();
	while (rit != lt.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

	list<int> lt1(lt);
	lt1.push_back(10);
	lt1.push_back(20);
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
}

void test2()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	print(lt);

	lt.pop_back();	// 尾删
	lt.pop_front(); // 头删
	print(lt);
}

// 任意位置的插入
void test3()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	print(lt);
	list<int>::iterator pos = find(lt.begin(), lt.end(), 3);
	// 一定要判断3是否在list内
	if (pos != lt.end())
	{
		lt.insert(pos, 30);
	}
	print(lt);
}

void test4()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(32);
	lt.push_back(40);
	lt.push_back(5);
	lt.sort();
	print(lt);
	lt.reverse();
	print(lt);
}

// 迭代器失效：erase
//迭代器失效不会报错，但是访问失效的迭代器就会报错
void test5()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(32);
	lt.push_back(40);
	lt.push_back(5);
	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		// 错误写法，erase之后这个位置就失效了
		//  if(*it % 2 == 0){
		//  	lt.erase(it);
		//  }
		//  ++it;
		if (*it % 2 == 0)
		{
			it = lt.erase(it);
		}else{
			++it;
		}
		
	}
}


//迭代器失效的总结：
//vector的iterator，push_back、insert、erase会失效
//list的iterator，erase会失效
int main()
{
	// test1();
	// test2();
	// test3();
	test4();
	return 0;
}